import tkinter as tk
from tkinter import ttk
from tkinter import messagebox

def main():
    root = tk.Tk()
    root.title("ttk.Combobox 完整示例")
    root.geometry("400x300")  # 窗口初始大小

    # -------------------------- 1. 准备绑定变量（textvariable 属性用）
    # 用 StringVar 绑定 Combobox 的值，实现双向同步
    combo_var = tk.StringVar()

    # -------------------------- 2. 定义 postcommand 函数（下拉展开前调用）
    # 功能：动态更新下拉选项（模拟从数据库/接口加载数据）
    def update_dropdown():
        # 这里模拟动态数据（实际场景可替换为数据库查询、API请求等）
        dynamic_values = ["Python", "Java", "C++", "JavaScript", "Go"]
        # 更新 Combobox 的 values 属性
        combo.config(values=dynamic_values)
        # 可选：给用户提示
        # messagebox.showinfo("提示", "下拉列表已更新最新语言选项！")

    # 注册函数（Tkinter 要求 postcommand 必须注册）
    registered_func = root.register(update_dropdown)

    # -------------------------- 3. 创建 Combobox 并配置所有核心属性
    combo = ttk.Combobox(
        master=root,          # 父容器
        textvariable=combo_var,  # 双向绑定变量
        values=["初始选项1", "初始选项2"],  # 初始下拉选项
        state="readonly",     # 仅可选择，不可直接编辑（避免用户输入无效内容）
        justify="center",     # 输入框文本居中对齐
        height=3,             # 下拉框显示3行选项（超出会滚动）
        width=20,             # 输入框宽度（约20个字符）
        exportselection=False,  # 选中内容不同步到系统全局（避免与其他控件冲突）
        postcommand=registered_func  # 下拉展开前调用注册的函数
    )

    # -------------------------- 4. 额外配置：设置默认选中值
    combo_var.set("请选择编程语言")  # 通过绑定变量设置默认提示文本
    # 或直接用 combo.set("请选择编程语言")

    # -------------------------- 5. 放置 Combobox（布局）
    combo.pack(pady=30)

    # -------------------------- 6. 演示：获取 Combobox 的值（绑定按钮）
    def get_combo_value():
        # 两种获取值的方式（等价，因为 textvariable 双向绑定）
        value1 = combo.get()          # 直接调用控件的 get() 方法
        value2 = combo_var.get()      # 通过绑定变量获取
        # 弹出提示显示结果
        messagebox.showinfo(
            "当前选择",
            f"直接获取：{value1}\n通过变量获取：{value2}"
        )

    # 创建按钮，点击触发获取值的函数
    btn = ttk.Button(root, text="获取当前选择", command=get_combo_value)
    btn.pack(pady=10)

    # -------------------------- 7. 演示：动态修改 Combobox 状态（绑定按钮）
    def toggle_state():
        current_state = combo["state"]  # 获取当前状态
        if current_state == "readonly":
            combo.config(state="normal")  # 切换为“可编辑+可选择”
            btn_state.config(text="切换为只读状态")
        else:
            combo.config(state="readonly")  # 切换回“仅可选择”
            btn_state.config(text="切换为可编辑状态")

    # 创建状态切换按钮
    btn_state = ttk.Button(root, text="切换为可编辑状态", command=toggle_state)
    btn_state.pack(pady=10)

    root.mainloop()

if __name__ == "__main__":
    main()